package com.gopay.bis.pab.ebank.operation;

import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;

import com.gopay.bis.common.util.BankLogUtils;
import com.gopay.common.constants.proccode.ProcCodeConstants;
import com.gopay.common.domain.bank.BaseMessage;
import com.gopay.common.domain.bank.pab.ebank.PabQueryOrdersMessageRes;
import com.gopay.common.exception.GopayException;
import com.gopay.common.util.HttpTransport;
import com.jcraft.jsch.Logger;

public class PabB2cQueryOrder {

	HttpTransport httpTransport;

	/**
	 * 查询
	 * 
	 * @param BaseMessage
	 *            message
	 * @return ResSDBQueryOrdersMessage
	 * @throws GopayException
	 */
	public PabQueryOrdersMessageRes query(BaseMessage message) throws GopayException {
		try {
			/**
			 * 请求查询接口参数
			 */
			Map<String, String> param = new HashMap<String, String>();
			param.put("MechantNo", message.getMerID());
			param.put("orderNo", message.getOrderId());
			param.put("Signature", message.getSignMessage());
			httpTransport.setUrl(message.getQueryUrl());
			
			BankLogUtils.printB2CQuerySendLog(message, param);
			String msgData = httpTransport.submit(param);
			BankLogUtils.printB2CQueryBlackLog(message, msgData);
			/**
			 * 解析查询接口返回报文
			 */
			PabQueryOrdersMessageRes pabQueryRes = parseB2C(msgData);
			return pabQueryRes;
		} catch (Exception e) {
			BankLogUtils.printB2CQueryExceptionLog(message, e);
			throw new GopayException(ProcCodeConstants.PROC_CODE_100E6037);
		}
	}
	/**
	 * 
	 * 功能描述：解析平安银行查询接口返回报文
	 * 定长报文格式如下：1|1000089745          2016042003612242                              0.01120160420 13:36:4720160420  2|
	 *
	 * @param returnData
	 * @return
	 * 
	 * @author 宣广海
	 * @throws GopayException 
	 *
	 * @since 2016年4月14日
	 *
	 * @update:[变更日期YYYY-MM-DD][更改人姓名][变更描述]
	 */
	private PabQueryOrdersMessageRes parseB2C(String returnData) throws GopayException {
		PabQueryOrdersMessageRes message = new PabQueryOrdersMessageRes();
		/**
		 * 验证 返回报文是否正常
		 */
		if(returnData.contains("error")||returnData.contains("ERROR")){
			return message;
		}
		/**
		 * 竖线是特殊字符，需要转义分割，用“\\”或者“[]”都可以转义
		 */
		String[] returnStr=returnData.split("[|]");
		String messageHead=returnStr[0];
		String messageBody=returnStr[1];
		if(!messageHead.trim().equals("1")){
			throw new GopayException(ProcCodeConstants.PROC_CODE_100E6039);
		}
		message.setMerID(messageBody.substring(0, 20).trim());
		message.setOrderId(messageBody.substring(20, 50).trim());
		message.setOrderAmount(new BigDecimal(messageBody.substring(50, 70).trim()));
		message.setStatus(messageBody.substring(70, 71).trim());
		return message;
	}

//	private PadQueryOrdersMessageReq getReqOrderMessage(BaseMessage message) {
//		PadQueryOrdersMessageReq req = new PadQueryOrdersMessageReq();
//		// 对账开始时间设为当前交易日期的前一天
//		java.util.Date dateInxTxnDt = DateUtils.strToDate((message.getOrderDate()));// 内部交易日期Date
//		java.util.Date beginDate = getConditionDate(Calendar.DATE, -1, dateInxTxnDt);
//		java.sql.Date sqlBeginDate = new java.sql.Date(beginDate.getTime());
//		// 对账开始时间设为当前交易日期
//		java.sql.Date sqlEndDate = new java.sql.Date(dateInxTxnDt.getTime());
//		req.setBeginDate(sqlBeginDate);
//		req.setEndDate(sqlEndDate);
//		req.setBeginTime("");
//		req.setEndTime("");
//		req.setOrderId(message.getOrderId());
//		return req;
//	}
//
//	/**
//	 * 根据日历的规则，为给定的日历字段添加或减去指定的时间量
//	 * 
//	 * @param field
//	 * @param amount
//	 * @param date
//	 *            给定时间
//	 * @return
//	 */
//	private java.util.Date getConditionDate(int field, int amount, java.util.Date date) {
//		Calendar calendar = Calendar.getInstance();// 默认日历
//		calendar.setTime(date);// 设置时间
//		calendar.add(field, amount);// 根据日历的规则，为给定的日历字段添加或减去指定的时间量
//		java.util.Date conditionDate = calendar.getTime();// 获得时间
//		return conditionDate;
//	}

	public void setHttpTransport(HttpTransport httpTransport) {
		this.httpTransport = httpTransport;
	}
}
